﻿//龙光版本当前禁用此扩展脚本。
window.$ = window.jQuery = window.$ || MJQ;
window.mapex = window.ex || {};
$(function () {

    //全局公共方法
    mapex.invokeRight = function (funcid, actionid) {
        //请求权限接口，需要用户实现
        return true;
    }
    mapex.reActive = function (btn, funcid, actionid) {
        if (mapex.invokeRight(funcid, actionid)) {
            document.getElementById(btn).syslock = 0;
            reDisplay(btn);
            reActive(btn);
        }
    }

    //对MAP对象进行扩展渲染
    $('form.map2').formExtend();
    $('iframe.grid').gridExtend();
    $('table.mnubar').gridMenuExtend();
    $('iframe[src*="/AppGridEx/"]').gridEExtend();
});


$.fn.extend({

    //*********************************
    //定向扩展
    mapex: function (config) {
        switch ((config.type || "").toLowerCase()) {
            case "appgride": {
                this.gridEExtend(config);
                break;
            }
            default:
        }
    },
    //*********************************
    //appForm
    formExtend: function (config) {
        var jqFrm = this;
        var frm = jqFrm[0];  //当前form对象（非jquery对象）
        if (!frm) {
            return;
        }

        var ex = config || {};
        frm.ex = ex;

        //用户自定义重写方法
        ex.onSave = function () {
        };
        ex.onBeforeSave = function () {
            return true;
        }
        ex.onAfterSaveInvoke = function (result) {
            return true;
        }


        //对外扩展调用方法
        ex.getData = function (opts) {
            /// <summary>
            ///  扩展form表单，自动收集form表单的内容为json数据对象
            /// </summary>
            /// <param name="options" type="String">扩展参数</param>
            /// <returns type="void"></returns>
            /// 创建人：杜一博
            /// 创建时间： 2015年4月29日

            var options = $.extend({}, opts);   //合并opts参数为options，以用户定义的为准，用户未定义的字段这是用默认值
            var formJSON = {};
            if (options.keyname && options.keyvalue) {
                //主键赋值
                formJSON[options.keyname] = options.keyvalue;
            }

            $('[name]', jqFrm).each(function (i, o) {
                //收集JSON
                var ths = $(this);
                var name = ths.attr('name');
                if (name) {
                    //忽略 （appForm_、 _） 等开头的元素和已经存在的元素
                    if ((/^_/).test(name) || (/^appForm_/i).test(name) || formJSON[name]) {
                        return true;   //continue
                    }

                    //收集其他元素，只能是表单类型元素
                    if (o.type) {
                        switch (o.type.toLowerCase()) {
                            case "radio":
                                {
                                    formJSON[name] = $('[name="' + o.name + '"]:checked', jqFrm).val();
                                    break;
                                }
                            default:
                                {
                                    formJSON[name] = ths.val();
                                    break;
                                }
                        }
                    }
                }
            });

            //返回收集结果
            return formJSON;
        };

        ex.onMode = function (modes, call) {

            /// <summary>
            ///  在不同的mode模式下触发的方法
            /// </summary>
            /// <param name="modes" type="String">页面的mode模式，逗号分隔。</param>
            /// <param name="call" type="String">回调函数</param>
            /// <returns type="void"></returns>
            /// 创建人：杜一博
            /// 创建时间： 2015年5月5日
            if (modes.indexOf($('#__mode').val()) >= 0) {
                call(); //调用方法
            }
        }

        ex.toMode = function (md) {
            //页面刷新为只读模式
            window.location.href = window.location.href.replace(/mode=[1-3]{1}/ig, 'mode=' + md);
        }

        ex.reloadParent = function () {
            //刷新父窗口通用方法
            try {
                window.opener._appGrid_Query();
            } catch (ex) { }
        };

        ex.submit = function (options) {
            /// <summary>
            ///  功能说明
            /// </summary>
            /// <returns type="void"></returns>
            /// 创建人：杜一博
            /// 创建时间： 2015年4月29日

            options = options || {};

            //请求并返回响应结果
            if (!frm.onBeforeSave()) { return false; } //保存前触发
            if (!frm.IsValid()) { return false; }   //表单校验

            var resp = frm.onSave();  //调用保存方法

            if (!resp) {
                //保存调用失败，提示错误信息
                alert("未知请求错误，请关闭窗口或稍后再试！");
                return;
            }
            if (resp.Result) {

                if (!frm.onAfterSave(resp)) { return false; }    //保存成功后触发

                //保存后设置窗口默认值，防止刷新窗口或关闭窗口前提示“未保存”信息。
                frm.setFormDefaultValue();

                try {
                    //刷新父列表（不一定存在appGrid，因此吃掉异常
                    window.opener._appGrid_Query();
                } catch (e) {
                }

                if (options.autoClose) {
                    //如果要关闭窗口，则关闭窗口
                    window.close();
                }

                //保存成功后可定义触发一个回调方法
                if (options.successCallback) {
                    options.successCallback(resp);
                }
                if (options.reload == false) {
                    //是否自动刷新？
                    return true;
                }
                if ($('#__mode').val() == "1") {
                    //新增模式刷新页面为编辑预览模式（OID=后台强制返回的结果，否则无法刷新）
                    window.location.href = window.location.href.replace(/mode=1/ig, 'mode=2') + "&oid=" + resp.Data.OID;
                } else {
                    //其他模式使用本链接重新刷新
                    window.location.href = window.location.href;
                }
                return true;
            } else {
                alert(resp.ErrorMessage ? resp.ErrorMessage : "未知错误，请稍后再试！");
                return false;
            }
        }

        ex.submitClose = function () {

            /// <summary>
            ///  提交后关闭窗口
            /// </summary>
            /// <returns type="void"></returns>
            /// 创建人：杜一博
            /// 创建时间： 2015年4月29日
            frm.ajaxSubmit({ autoClose: true });
        };

        ex.setReadOnly = function () {
            //设置表单内的控件为只读状态
            $("[name]", jqFrm).each(function () {
                try {
                    this.setReadOnly(true, true);
                } catch (e) {
                }
            });
        }
    },



    //*********************************
    //appGrid
    gridExtend: function (config) {

        var grid = this[0];  //appGrid对象
        if (!grid) {
            return;
        }
        var fe = window[grid.id].frameElement; //appGrid.frameElement对象

        //自定义对象
        var ex = config || {};

        //为appGrid对象绑定ex扩展
        window[grid.id].ex = ex;

        ex.commands = ex.commands || {};  //装载用户命令
        ex.commandOptions = ex.commandOptions || {};

        //内置触发方法
        ex.addCommand = function (cmdName, call, opts) {
            /// <summary>
            ///  添加自定义命令。可通用于在表单上增加操作按钮来操作选中行数据的场景。
            /// </summary>
            /// <param name="cmdName" type="String">说明</param>
            /// <param name="call" type="String">说明</param>
            /// <returns type="void"></returns>
            /// 创建人：杜一博
            /// 创建时间： 2015年5月5日
            ex.commands[cmdName] = function () {
                var selecteds = fe.getSelected();
                if (!selecteds) {
                    return;
                }
                if (ex.commandOptions[cmdName].confirm
                    && !confirm(ex.commandOptions[cmdName].confirmMsg)) {
                    return;
                }
                var aOID = new Array();
                var aRows = new Array();
                for (var i = 0; i < selecteds.length; i++) {
                    aOID.push(selecteds[i].oid);
                    aRows.push($.extend({}, selecteds[i]));
                }
                var resp = call(aOID, aRows);

                //不需要刷新界面或提示信息
                if (ex.commandOptions[cmdName].autoReload) {
                    //需要后台处理并刷新表单或提示信息
                    if (!resp) {
                        alert("未知请求错误，请关闭窗口或稍后再试！");
                        return;
                    }

                    if (resp.Result) {
                        //处理成功
                        fe.Query(); //刷新列表
                    } else {
                        alert(resp.ErrorMessage ? resp.ErrorMessage : "未知错误，请稍后再试！");
                    }
                }
            };
            ex.commandOptions[cmdName] = $.extend({
                confirm: false,
                confirmMsg: "确定处理选中项？",
                autoReload: false
            }, opts);
        };

        ex.eachRows = function (call) {

            /// <summary>
            /// 便利所有TR行方法
            /// </summary>
            /// <param name="colname" type="String">说明</param>
            /// <param name="call" type="String">说明</param>
            /// <returns type="void"></returns>
            /// 创建人：杜一博
            /// 创建时间： 2015年5月6日
            var rows = fe.getAllRows();
            if (!rows || !call) { return; }
            $.each(rows, function (i, d) {
                call(d);
            });
        };
    },


    //*********************************
    //appGridMenu
    gridMenuExtend: function (config) {

        var menu = this[0];  //appGridMenu对象

        //自定义对象
        menu.ex = config = config || {};

        menu.ex.appendBeforeMenu = function (html) {
            /// <summary>
            /// 在菜单按钮前追加HTML代码
            /// </summary>
            /// <param name="html" type="String">html代码</param>
            /// <returns type="void"></returns>
            /// 创建人：杜一博
            /// 创建时间： 2015年5月8日

            $('<td style="width:100%; text-align:right;" class="custom-menuRight"></td>').html(html).insertBefore($('.mnuRight', menu).first());
        };

        menu.ex.setTitle = function (title) {
            $(menu).find("tr:first>td:first").html('<b>' + title + '</b>');
        };
    },



    //*********************************
    //appGridE
    gridEExtend: function (config) {

        var grid = this[0];  //appGrid对象
        if (!grid) {
            return;
        }
        var fe = window[grid.id]; //appGridE对象

        //自定义对象
        var ex = $.extend({}, config, true);

        //为appGrid对象绑定ex扩展
        window[grid.id].ex = ex;

        ex.commands = ex.commands || {};  //装载用户命令
        ex.commandOptions = ex.commandOptions || {};


        //内置触发方法
        ex.addCommand = function (cmdName, callback, opts) {
            /// <summary>
            ///  添加自定义命令。可通用于在表单上增加操作按钮来操作选中行数据的场景。
            /// </summary>
            /// <param name="cmdName" type="String">说明</param>
            /// <param name="callback" type="String">说明</param>
            /// <returns type="void"></returns>
            /// 创建人：杜一博
            /// 创建时间： 2017年5月18日
            ex.commands[cmdName] = function () {
                var resp = callback.call(fe, null, null);
            };
            ex.commandOptions[cmdName] = $.extend({
                confirm: false,
                confirmMsg: "确定处理选中项？",
                autoReload: false
            }, opts);
        };


        //新增行
        ex.insertRow = function (param) {
            /// <summary>
            ///  新增行
            /// </summary>
            /// <param name="param" type="Object">JSON对象</param>
            /// <returns type="void"></returns>
            /// 创建人：杜一博
            /// 创建时间： 2017年5月18日

            var xml = fe.GetXml();  //获取AppGridE的Xml配置信息
            var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
            xmlDoc.async = false;
            xmlDoc.loadXML(xml);

            //获取解析字段需要的节点
            var rowInfo = xmlDoc.selectSingleNode("/AppGridEx/AppGridE/RowInfo");
            var attrNodes = rowInfo.selectNodes("Attribute") || [],
                rowNodes = rowInfo.selectNodes("Row"),
                cellNodes = [];
            if (rowNodes && rowNodes.length > 0) {
                cellNodes = rowNodes[rowNodes.length - 1].selectNodes("Cell") || [];
            }

            //获取字段数组
            var attrs = [], cells = [];
            param.row = param.row || {};

            for (var i = 0; i < attrNodes.length; i++) {
                var _name = attrNodes[i].getAttribute("name");
                attrs[i] = (param.row[_name] === undefined) ? "" : param.row[_name];
            }
            for (var i = 0; i < cellNodes.length; i++) {
                var _name = cellNodes[i].getAttribute("name");
                if (param.row[_name] === undefined) {
                    cells[i]="";
                }
                if (typeof param.row[_name] === "object") {
                    cells[i] = [];
                    for (o in param.row[_name]) {
                        cells[i][o] = param.row[_name][o];
                    }
                }
            }

            //增加行
            fe.AddRow.call(fe, attrs, cells, param.index);
        }


        //获取行，返回JSON格式数据
        ex.getSelected = function () {
            var xml = fe.GetXml();  //获取AppGridE的Xml配置信息
            var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
            xmlDoc.async = false;
            xmlDoc.loadXML(xml);

            var rowData = xmlDoc.selectSingleNode("/AppGridEx/AppGridE/RowData");
            var rowNodes = rowData.selectNodes("Row");

            var rowIndex = fe.GetSelectedRows();
            if (rowIndex < 0) {
                return null;
            }

            var rowNode = rowNodes[rowIndex];
            var row = {};
            for (var i = 0; i < rowNode.attributes.length; i++) {
                row[rowNode.attributes[i].name] = rowNode.getAttribute(rowNode.attributes[i].name);
            }
            return row;
        }


        /// <summary>
        /// 获取当前页所有数据行
        /// </summary>
        /// <returns type="[]"></returns>
        /// 创建人：杜一博
        /// 创建时间： 2017年5月19日
        ex.getRows = function () {
            var xml = fe.GetXml();  //获取AppGridE的Xml配置信息
            var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
            xmlDoc.async = false;
            xmlDoc.loadXML(xml);

            var rowData = xmlDoc.selectSingleNode("/AppGridEx/AppGridE/RowData");
            var rowNodes = rowData.selectNodes("Row");

            var rows = [];
            for (var rowIndex = 0; rowIndex < rowNodes.length; rowIndex++) {
                var rowNode = rowNodes[rowIndex];
                var row = {};
                for (var i = 0; i < rowNode.attributes.length; i++) {
                    row[rowNode.attributes[i].name] = rowNode.getAttribute(rowNode.attributes[i].name);
                }
                rows.push(row);
            }
            return rows;
        }
    }

});